﻿//using System;
//using System.Collections.Generic;
//using InseSoft.Model.Entities;
//using InseSoft.ViewModels;
//using NHibernate;
//using NHibernate.Criterion;

//namespace InseSoft.Model.Repositories
//{
//    public class Repository : IRepository
//    {
//        #region Declarations

//        public const string IdField = "Id";
//        public const string NombreField = "Nombre";

//        #endregion

//        #region Constructors

//        public Repository() : this(new SqlDatabase().OpenSession()) { }

//        public Repository(ISession session)
//        {
//            Session = session;
//            CurrentDateProvider = GetCurrentDate;
//        }

//        #endregion

//        #region Properties

//        public ISession Session { get; private set; }

//        public Func<DateTime> CurrentDateProvider { get; set; }

//        #endregion
        
//        #region Methods: Public
        
//        public T GetById<T>(int id)
//        {
//            using (var transaction = Session.BeginTransaction())
//            {
//                var entity =  Session.Get<T>(id);
//                transaction.Commit();
//                return entity;
//            }
//        }
        
//        public IEnumerable<T> GetActive<T>() where T : new()
//        {
//            using (var transaction = Session.BeginTransaction())
//            {
//                var query = Session.CreateCriteria(typeof(T));
//                var entityType = typeof(T);
//                if (entityType.GetProperty("Empresa") != null)
//                    query.Add(EqOrNull("Empresa", ApplicationSession.Instance.Empresa));
//                if (entityType.GetProperty("Activo") != null)
//                    query.Add(Restrictions.Eq("Activo", true));
//                if (entityType.GetProperty("Nombre") != null)
//                    query.AddOrder(new Order("Nombre", true));
//                var result = query.List<T>();
//                transaction.Commit();
//                return result;
//            }
//        }

//        public IEnumerable<T> GetAll<T>() where T : new()
//        {
//            using (var transaction = Session.BeginTransaction())
//            {
//                var query = Session.CreateCriteria(typeof(T));
//                var entityType = typeof(T);
//                if (entityType.GetProperty("Empresa") != null)
//                    query.Add(EqOrNull("Empresa", ApplicationSession.Instance.Empresa));
//                if (entityType.GetProperty("Nombre") != null)
//                    query.AddOrder(new Order("Nombre", true));
//                transaction.Commit();
//                return query.List<T>();
//            }
//        }

//        public T Save<T>(T entity) where T : new()
//        {
//            using (var transaction = Session.BeginTransaction())
//            {
//                Session.SaveOrUpdate(entity);
//                transaction.Commit();
//                return entity;
//            }
//        }

//        public void Delete<T>(T entity) where T : new()
//        {
//            using (var transaction = Session.BeginTransaction())
//            {
//                Session.Delete(entity);
//                transaction.Commit();
//            }
//        }
        
//        public TipoCambio GetTipoCambioByDate(DateTime fecha)
//        {
//            var result = ( from t in Session.QueryOver<TipoCambio>()
//                           where t.Empresa == ApplicationSession.Instance.Empresa
//                                && t.Fecha == fecha
//                           orderby t.Id
//                           select t).Desc().Take(1).SingleOrDefault();
//            return result;
//        }
        
//        public T GetOrNew<T>(int id) where T : class, new()
//        {
//            return GetById<T>(id) ?? new T();
//        }

//        public T Create<T>()
//        {
//            return Activator.CreateInstance<T>();
//        }

//        #endregion

//        #region Methods: Non-Public

//        private static AbstractCriterion EqOrNull(string property, object value)
//        {
//            return value == null ? Restrictions.IsNull(property) : Restrictions.Eq(property, value);
//        }

//        public DateTime GetCurrentDate()
//        {
//            return Session.CreateSQLQuery("SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))")
//                            .UniqueResult<DateTime>();
//        }

//        #endregion
//    }
//}
